#include "stdafx.h"
#include "Win32Clipboard.h"
#include "../CreationAssist/Clipboard.h"



VWD::Win32Clipboard::Win32Clipboard(HWND owner):ownerWindow(owner)
{
	CA::Clipboard::OnSetData.connect(boost::bind(&VWD::Win32Clipboard::Clipboard_OnSetData,this,_1));
	CA::Clipboard::OnGetData.connect(boost::bind(&VWD::Win32Clipboard::Clipboard_OnGetData,this));
}

VWD::Win32Clipboard::~Win32Clipboard(void)
{
	CA::Clipboard::OnSetData.disconnect(boost::bind(&VWD::Win32Clipboard::Clipboard_OnSetData,this,_1));
	CA::Clipboard::OnGetData.disconnect(boost::bind(&VWD::Win32Clipboard::Clipboard_OnGetData,this));
}

void VWD::Win32Clipboard::Clipboard_OnSetData( const std::string& str )
{
	if(OpenClipboard(ownerWindow))
	{
		EmptyClipboard();
// #ifdef UNICODE
// 		const char* c = str.c_str();
// 		static std::wstring wstr;
// 		wchar_t e;
// 		wstr.clear();
// 		int i = 0;
// 		while(c[i])
// 		{
// 			if(unsigned char(c[i])>=161)
// 			{ 
// 				MultiByteToWideChar(0,0,c+i,2,&e,1);
// 				wstr.append(1,e);
// 				i+=2;
// 			} 
// 			else
// 			{
// 				wstr.append(1,c[i]);
// 				i++;
// 			}
// 		}
// 		
// 		const wchar_t* wsrc = wstr.c_str();		
// 		int sz = (wstr.size()+1)*sizeof(wchar_t);
// 		HANDLE hDst = GlobalAlloc(GMEM_MOVEABLE,sz);
// 		wchar_t* dst = (wchar_t*)GlobalLock(hDst);		
// 		wcscpy(dst,wsrc);
// 		dst[sz-1]=0;
// 		GlobalUnlock(hDst);
// #else
// 		int sz = (str.size()+1)*sizeof(char);
// 		HANDLE hDst = GlobalAlloc(GMEM_MOVEABLE,sz);
// 		char* dst = (char*)GlobalLock(hDst);
// 		strcpy(dst,str.c_str());
// 		dst[sz-1]=0;
// 		GlobalUnlock(hDst);
// #endif
		int sz = (str.size()+1)*sizeof(char);
		HANDLE hDst = GlobalAlloc(GMEM_MOVEABLE,sz);
		char* dst = (char*)GlobalLock(hDst);
		strcpy(dst,str.c_str());
		dst[sz-1]=0;
		GlobalUnlock(hDst);

		SetClipboardData(CF_TEXT,hDst);
		CloseClipboard();
	}	
}

std::string VWD::Win32Clipboard::Clipboard_OnGetData()
{
	static std::string empty;
	if(OpenClipboard(ownerWindow))
	{
		HANDLE hData = GetClipboardData(CF_TEXT);
		if(hData!=NULL)
		{
//			LPTSTR lptstr = (LPTSTR)GlobalLock(hData);
// #ifdef UNICODE
// 			//LPTSTR is wchar_t*			
// 			int i= WideCharToMultiByte(CP_ACP,0,lptstr,-1,NULL,0,NULL,NULL);
// 			char *strB = new char[i];
// 			WideCharToMultiByte (CP_ACP,0,lptstr,-1,strB,i,NULL,NULL);
// 			std::string ret(strB);
// 			delete strB;
// #else
// 			std::string ret(lptstr);
// #endif
			std::string ret((char*)GlobalLock(hData));
			GlobalUnlock(hData);
			CloseClipboard();
			return ret;
		}
		CloseClipboard();
	}

	return empty;
}